`timescale 1ns/1ns
`define clk_period 20

module ram_tb;
	
	reg clk;
	reg wren;
	reg [7:0] ram_input;
	reg [11:0] wraddress;
	reg [11:0] rdaddress;
	wire [7:0] ram_output;
	
	ram ram(
		.clock(clk),
		.wren(wren),
		.data(ram_input),
		.wraddress(wraddress),
		.rdaddress(rdaddress),
		.q(ram_output)
	);
	
	
	initial clk = 1'b0;
	always #(`clk_period/2) clk = ~clk;
	initial begin
		// 先测试读
		// wren 写使能
		// 读 是第一个上升沿读取地址
		// 第二个上升沿输出
		// 写 也是第一个上升沿读取写入数据和地址
		// 第二个上升沿写入到RAM
		// 读写都需要两个时钟周期，即两个上升沿
		wren = 1;
		ram_input = 11'b0;
		wraddress = 11'b0;
		rdaddress = 11'b0;
		#(`clk_period*2);
		rdaddress = 1'b0;
		#(`clk_period*2);
		rdaddress = 11'd100;
		#(`clk_period*2);
		rdaddress = 11'd2804;
		#(`clk_period*2);
		rdaddress = 1'b0;
		// 再测试写 第0号位 wren 
		// wren = 1'b0;
		#(`clk_period*2);
		wraddress = 1'b0;
		ram_input = 1'b1;
		wren = 1'b1;
		#(`clk_period*2);
		wren = 1'b0;
		rdaddress = 1'b0;
		#(`clk_period*2);
		$stop;
	end
endmodule
